﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Reflection;

namespace Jc.MicroDesigner.Management
{
    /// <summary>
    /// Класс анализа сборок
    /// </summary>
    public class AssemblyClassAnalyser
    {
        Assembly _Assembly = null;

        /// <summary>
        /// Конструктор
        /// </summary>
        /// <param name="assembly_file">Загружаемая сборка</param>
        public AssemblyClassAnalyser(string assembly_file)
        {
            try
            {
                _Assembly = Assembly.LoadFile(assembly_file);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        /// <summary>
        /// Получить список классов наследующих данный
        /// </summary>
        /// <param name="find_type">Тип-родитель</param>
        /// <returns>Список классов</returns>
        public List<Type> GetListOfPublicClass(Type find_type)
        {
            List<Type> result = new List<Type>();
            if (_Assembly != null)
            {
                Type[] types = _Assembly.GetExportedTypes();
                if (types != null)
                {
                    for (int i = 0; i < types.Length; i++)
                    {
                        //object find_object = find_type.Assembly.CreateInstance(find_type.FullName);
                        //object type_class = _Assembly.CreateInstance(types[i].FullName);
                        if ((types[i].IsClass))
                            if (types[i].IsSubclassOf(find_type))
                            {
                                result.Add(types[i]);
                            }
                    }
                }
            }
            return result;
        }
    }
}